/*
 * GrupoReceptor.h
 *
 *  Created on: Feb 24, 2010
 *      Author: jgrande
 */

#ifndef _DIRECTORIO_JUEGO_H_
#define _DIRECTORIO_JUEGO_H_

#include <list>
#include <string>
#include <iostream>

#include "Jugador.h"
#include "Universo.h"

#include "../Common/CommonTypes.h"
#include "../Common/Mensajes/Encabezado.h"
#include "../Common/Mensajes/DatosInicioJuego.h"
#include "../Common/Mensajes/DatosCambiaDuenio.h"
#include "../Common/Mensajes/MensajeAplicacion.h"
#include "../Common/Mensajes/MensajesCommonTypes.h"

#include "../../Middleware/Common/IdJugador.h"
#include "../../Middleware/Comunicaciones/MiddlewareCliente.h"
#include "../../Middleware/EnDirectorio/Anillo.h"

using std::list;
using std::string;

using middleware::common::Cantidad;
using middleware::common::Direccion;
using middleware::common::T_ID_UNIVERSO;
using middleware::common::T_ID_JUEGO;
using middleware::common::T_ID_JUGADOR;

namespace aplicacion {
namespace directorio {

class Juego {

	T_ID_JUGADOR id;

	Universo* universo;

	T_ID_JUGADOR nextJugadorId;

	Cantidad min, max;

	list<Jugador> jugadores;

	string descripcion;

	middleware::directorio::Anillo* anillo;

	bool abierto;

	int cantidadListos;

	bool iniciado;

	bool crearAnillo();

	bool informarJugadores();

	bool informarPlanetas();

public:

	Juego(T_ID_JUEGO id, Cantidad min, Cantidad max, string descripcion,
			Universo* universo);

	~Juego();

	T_ID_JUEGO getId() const { return id; }

	Cantidad getMax() const { return max; }

	Cantidad getMin() const { return min; }

	string getDescripcion() const { return descripcion; }

	T_ID_JUGADOR suscribir(Direccion dir);

	bool_t desuscribir(T_ID_JUGADOR idJugador);

	bool isAbierto() const { return abierto; }

	void cerrar() { abierto = false; }

	bool jugadorListo(T_ID_JUGADOR idJugador);

	bool isListo() const;

	bool isIniciado() const;

	Universo* getUniverso() { return universo; }

	const Universo* getUniverso() const { return universo; }

	bool iniciar();

};

std::ostream& operator<<(std::ostream& os, const Juego& j);

}
}

#endif /* _DIRECTORIO_JUEGO_H_ */
